#pragma once

#include <chrono>

namespace application {
namespace simulation {

/**
 * @brief 仿真时钟 - 管理仿真时间推进
 * @details 支持加速/减速/暂停/步进，与真实时间解耦
 */
class SimulationClock {
public:
    SimulationClock();

    /**
     * @brief 时间步进
     * @param realDeltaTime 真实时间增量（秒）
     */
    void tick(double realDeltaTime);

    /**
     * @brief 获取当前仿真时间（秒）
     */
    double getSimulationTime() const { return m_simulationTime; }

    /**
     * @brief 设置时间缩放系数
     * @param scale 缩放系数（1.0=实时，2.0=2倍速，0.5=慢放）
     */
    void setTimeScale(double scale);

    /**
     * @brief 获取时间缩放系数
     */
    double getTimeScale() const { return m_timeScale; }

    /**
     * @brief 设置暂停状态
     */
    void setPaused(bool paused) { m_paused = paused; }

    /**
     * @brief 检查是否暂停
     */
    bool isPaused() const { return m_paused; }

    /**
     * @brief 重置时钟
     */
    void reset();

    /**
     * @brief 单步推进（用于调试）
     * @param deltaTime 推进时间量（秒）
     */
    void step(double deltaTime);

private:
    double m_simulationTime;  // 仿真时间（秒）
    double m_timeScale;        // 时间缩放系数
    bool m_paused;             // 是否暂停
};

} // namespace simulation
} // namespace application
